package com.hzqy.web.filter;

import com.hzqy.service.commons.OrgModelFilterService;
import com.hzqy.service.hqjc.HqjcServiceBean;
import com.hzqy.service.itf.YxtItfServiceBean;
import com.hzqy.web.login.SessionKey;
import com.hzqy.web.vo.CmContentVo;
import com.hzqy.web.vo.EpgInfoVo;
import com.hzqy.web.vo.PmsOrgVo;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

//重点注意：此Filter模块目前业务规则只适用酒店行业应用和学校行业应用，增值类怀球剧场、教育、K歌等都不适用，需要在WEB-INF/web.xml中注释。

/**
 * 1、根据session中的业务账号查找归属企业或学校ID
 * 2、后续根据分类得到内容业务规则是当有企业ID或学校ID的用户取对应的信息，
 *   如果业务账号未归属任何企业或学校，则出现提示此账号未受理，请联系客户经理，底下有进入宽带电视按钮。
 *   酒店行业应用是出现默认木纹模板。
 * @author Administrator
 *
 */
public class OrgModelFilter implements Filter {
	private static final Log LOG = LogFactory.getLog(OrgModelFilter.class);
	
	public void init(FilterConfig fConfig) throws ServletException {
		LOG.debug("查询用户模板信息过滤器启动...");
	}
	
	/**
	 * 判断uri是否需要进入过滤器进行业务处理
	 */
	public boolean isUnfilteredUri(String uri) {
		return uri.endsWith("warn.jsp")||uri.endsWith(".do") || uri.endsWith("demo.jsp") || uri.endsWith("error.jsp") || uri.endsWith("release.jsp") || 
				uri.endsWith("service_authentication.jsp") || uri.endsWith("service_order.jsp") || uri.endsWith("service_order_back.jsp") || 
				uri.endsWith("service.jsp") || uri.endsWith(".jpg") || uri.endsWith(".gif") || uri.endsWith("proving.js") ||
				uri.endsWith(".png") || uri.endsWith("dispatcher.jsp") || uri.endsWith("not_bind_model.jsp") || 
				uri.indexOf("tv_proving") >= 0  || uri.indexOf("/interface/") >= 0 || (uri.indexOf("/mobile_tv_wchat_service/") >= 0||uri.indexOf("msykAccountBinding.do") >= 0
				|| uri.indexOf("/third_wechat_payment/") >= 0 || uri.indexOf("/mclz/") >= 0);
	}
	/**
	 * 在实现时注意当用户取到归属企业或学校ID后，应存入session中key为SessionKey.SESSION_USER_FOR_ORG_INFO，存储com.hzqy.web.vo.PmsOrgVo
	 * 当用户再请求平台其他资源时，应先判定session中是否有相关企业信息，有则不再进行查询操作。
	 * 
	 * Session : 
	 * 	{
	 * 		SessionKey.SESSION_USER_FOR_ORG_INFO, com.hzqy.web.vo.PmsOrgVo,
	 * 		SessionKey.SESSION_SERVERID, serverid
	 *  }
	 * 
	 */
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		HttpServletRequest req = ((HttpServletRequest)request);
		HttpServletResponse resp = ((HttpServletResponse)response);
		HttpSession session = req.getSession();
		String uri = req.getRequestURI();
		if(isUnfilteredUri(uri)) { //不过滤的页面
			chain.doFilter(request, response);
		}else{
			EpgInfoVo epgInfoVo = (EpgInfoVo) session.getAttribute(SessionKey.SESSION_EPGINFO_VO);
			String serverId = epgInfoVo.getOss_user_id();
			String epg_info = req.getParameter("epg_info");
			
			Map<String, Object> param = new HashMap<String, Object>();
			param.put("request", req);
			param.put("response", resp);
			param.put("chain", chain);
			param.put("filter", this);
			param.put("serverId", serverId);
			
			PmsOrgVo orgVo=(PmsOrgVo)session.getAttribute(SessionKey.SESSION_USER_FOR_ORG_INFO);
			boolean notBindModelFlag = true; //未绑定模板判定true未绑定，false绑定
			if(epg_info != null && epg_info.trim().length() > 0){//按首页进入时重新对存储数据进行处理
				LOG.debug("session过期或者首次登陆，开始用户登录..");
				OrgModelFilterService filterService = OrgModelFilterService.getInstance(uri, session);//通过uri获取接下去所有逻辑操作的业务对象
				filterService.handleEvent(OrgModelFilterService.SESSION_PMS_ORG_IS_EMPTY, param);
				
				WebApplicationContext webApplicationContext = WebApplicationContextUtils.getWebApplicationContext(session.getServletContext()); 
				HqjcServiceBean hqjcService = (HqjcServiceBean)webApplicationContext.getBean("hqjcServiceBean");
				YxtItfServiceBean yxtItfService = (YxtItfServiceBean)webApplicationContext.getBean("yxtItfServiceBean");
				orgVo = yxtItfService.selectContentOrgList(serverId, filterService.getCatalogidOfServerid()); //这里定义业务账号必须绑定目录
				if(orgVo!=null){
					LOG.debug("查询得到 用户= "+serverId+" 对应的组织= "+orgVo.getF_po_name());
					session.setAttribute(SessionKey.SESSION_USER_FOR_ORG_INFO, orgVo);
					filterService.handleEvent(OrgModelFilterService.PMS_ORG_OF_SERVERID_FOUND, param);
					
					if(orgVo.getF_po_model() > 0){
						CmContentVo contentVo = new CmContentVo();
						contentVo.setF_cc_id(orgVo.getF_po_model());
						contentVo=hqjcService.selectContent(contentVo);
						if(contentVo != null){//获取企业绑定模板路径
							String modelPath=contentVo.getF_cc_desc().replaceAll("<([^>]*)>","");
							orgVo.setF_po_model_url(modelPath);
							notBindModelFlag = false;
							LOG.debug("用户="+serverId+" 对应的组织模板路径="+req.getContextPath()+modelPath);
						}else{
							LOG.error("无法获取id=" + orgVo.getF_po_model() + "的模版内容 业务账号="+serverId);
							filterService.handleEvent(OrgModelFilterService.MODEL_NOT_FOUND, param);
						}
					}else{
						LOG.error("组织=" + orgVo.getF_po_name() + " 未选择模版！");
					}
				}else{
					LOG.debug("查到 用户= "+serverId+" 没有对应的组织");
					filterService.handleEvent(OrgModelFilterService.PMS_ORG_OF_SERVERID_NOT_FOUND, param);
				}
				
				if(notBindModelFlag) {
					LOG.error("查询用户模板信息失败 未找到用户"+serverId+"对应的模板 orgVo="+orgVo);
					filterService.handleEvent(OrgModelFilterService.USER_PMS_ORG_MODEL_NOT_FOUND, param);
				} else {
					LOG.debug("已经存在模板 用户="+serverId+" 对应的企业="+orgVo.getF_po_name()+" 对应的模板路径="+orgVo.getF_po_model_url());
					filterService.handleEvent(OrgModelFilterService.USER_PMS_ORG_MODEL_FOUND, param);
					chain.doFilter(request, response);
				}
			} else {
				chain.doFilter(request, response);
			}
		}
	}
	
	public void destroy() {
		LOG.debug("查询用户模板信息过滤器销毁...");
	}
	
}
